/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package pwfkasse.logik;

/**
 *
 * @author Stefan
 */
/*
 * Bildbetrachter.java - Bilder laden und drucken
 * Als Beispiel für den Print Vorgang verschwindet 
 * aber später wieder aus dem Source :-D 
 * Gruesse Stefan 
 * 
 *
 */

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import java.io.*;
import java.awt.image.BufferedImage;
import javax.imageio.*;

import java.awt.print.*;
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;


public class Bildbetrachter extends JFrame {
   static Bildbetrachter fenster;
   String dateiname;                // Name der Bilddatei
   BufferedImage  bild;             // Referenz auf das aktuelle Bild
   BildLeinwand leinwand;           // JPanel zum Anzeigen des Bildes

   JMenuBar menuleiste = new JMenuBar();

   JMenu     menuDatei               = new JMenu();
   JMenuItem menuDateiOeffnen        = new JMenuItem();
   JMenuItem menuDateiDrucken        = new JMenuItem();
   JMenuItem menuDateiBeenden        = new JMenuItem();

   // Innere Klasse zum Überschreiben von paintComponent()
   class BildLeinwand extends JPanel implements Printable {

      public void paintComponent(Graphics g) {
         super.paintComponent(g);

         if(bild != null) 
            g.drawImage(bild, 0, 0, bild.getWidth(),
                                    bild.getHeight(), this);
      }

      public int print(Graphics pg, PageFormat pf, int seitennr) 
                                            throws PrinterException {
         if( seitennr > 0 ) 
            return Printable.NO_SUCH_PAGE;

         pg.translate((int) pf.getImageableX(), 
                      (int) pf.getImageableY());
         int pgBreite = (int) pf.getImageableWidth();
         int pgHoehe  = (int) pf.getImageableHeight();

         int b = bild.getWidth();
         int h = bild.getHeight();

         if (b > pgBreite) {
            double skalierung = (double) pgBreite / (double) b;
            b = (int) (b*skalierung);
            h = (int) (h*skalierung);
         }
         if (h > pgHoehe){
            double skalierung = (double) pgHoehe / (double) h;
            b = (int) (b*skalierung);
            h = (int) (h*skalierung);
         }

         pg.drawImage(bild, 0, 0, b, h, this);

         return Printable.PAGE_EXISTS;
      }

      public Dimension getPreferredSize() {
         if (bild != null)
            return new Dimension(bild.getWidth(), bild.getHeight());
         else 
            return fenster.getSize();
      }
   }


   Bildbetrachter() {
      super();

      // Hauptfenster einrichten
      setTitle("Bildbetrachter");
      getContentPane().setBackground(Color.LIGHT_GRAY);

      // Menüleiste
      JMenuBar menueleiste = new JMenuBar();
      menuDatei.setText("Datei");
      menuDateiOeffnen.setText("Öffnen");
      menuDateiOeffnen.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            bildOeffnen();
         }
      });
      menuDateiDrucken.setText("Drucken");
      menuDateiDrucken.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            bildDrucken();
         }
      });
      menuDateiBeenden.setText("Beenden");
      menuDateiBeenden.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            System.exit(0);
         }
      });
      menuDatei.add(menuDateiOeffnen);
      menuDatei.addSeparator();
      menuDatei.add(menuDateiDrucken);
      menuDatei.addSeparator();
      menuDatei.add(menuDateiBeenden);
      menueleiste.add(menuDatei);

      setJMenuBar(menueleiste);


      // Eine Leinwand anlegen (von JPanel abgeleitet)
      leinwand  = new BildLeinwand();
      getContentPane().add(leinwand, BorderLayout.CENTER);
  

      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   }


   // Ereignisbehandlungsmethoden für Komponenten

   protected void bildOeffnen() {

      class PngFilter extends FileFilter {

         public String getDescription() {
            return "Portable Network Graphic (*.png)";
         }

         public boolean accept(File f) {
            if (f == null)
               return false;
            if (f.isDirectory())
               return true;
            return f.getName().toLowerCase().endsWith(".png");
         }
      }

      JFileChooser oeffnenDialog = new JFileChooser();
      oeffnenDialog.setCurrentDirectory(new File("."));
      oeffnenDialog.setFileFilter(new PngFilter());
      oeffnenDialog.setAcceptAllFileFilterUsed(false);

      if (JFileChooser.APPROVE_OPTION == oeffnenDialog.showOpenDialog(this)) {
         this.dateiname = oeffnenDialog.getSelectedFile().getPath();

         try {
            bild = ImageIO.read(new File(dateiname));

            leinwand.repaint();
            pack();

         } catch(IOException e) {
            dateiname = null;
            bild     = null;
         }
      }
   }

   protected void bildDrucken()  {
      // Wenn noch kein Bild geladen, gleich zurückkehren
      if (dateiname == null)
         return;

      // Druckparameter einstellen
      DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
      PrintRequestAttributeSet attrs = 
                                  new HashPrintRequestAttributeSet();
      attrs.add(Chromaticity.MONOCHROME);
      attrs.add(MediaSizeName.ISO_A5);
      attrs.add(OrientationRequested.LANDSCAPE);
      attrs.add(PrintQuality.NORMAL);
      attrs.add(new Copies(1));
      String n = dateiname.substring(dateiname.lastIndexOf('\\')+1, 
                                     dateiname.length());
      attrs.add(new JobName(n, null));
      
      // Wähle einen Drucker aus, der die Druckparameter unterstützt      
      PrintService service;
      PrintService[] services = 
                 PrintServiceLookup.lookupPrintServices(flavor, attrs);
      if (services.length > 0) {
         service = services[0];
      } else {
         // weiche auf Standarddrucker aus
         attrs = new HashPrintRequestAttributeSet();
         attrs.add(new JobName(n, null));
         service = PrintServiceLookup.lookupDefaultPrintService();
      }
      
      // Drucken
      if (service != null) {
         try {
            // Druckjob erstellen
            PrinterJob druckJob = PrinterJob.getPrinterJob();
            druckJob.setPrintService(service);
      
            // Druckdaten laden
            druckJob.setPrintable(leinwand);
          
            // drucken
            if (druckJob.printDialog(attrs))
              druckJob.print(attrs); 
              
         } catch (PrinterException e) {
            System.out.printf("%s\n", e.getMessage());
         }
     
      } else {
         JOptionPane.showMessageDialog(fenster, 
                                       "Keinen Drucker gefunden", 
                                       "Druckfehler", 
                                       JOptionPane.ERROR_MESSAGE);
      }

/*
     // Druckern aus Datei
     
     
      // Wenn noch kein Bild geladen, gleich zurückkehren
      if (dateiname == null)
         return;

      // Druckparameter definieren
      DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG;
      PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
      String n = dateiname.substring(dateiname.lastIndexOf('\\')+1, 
                                     dateiname.length());
      attrs.add(new JobName(n, null));
      attrs.add(new Copies(1));
      
      // Standardrucker auswählen und in Stille drucken
      PrintService service = PrintServiceLookup.lookupDefaultPrintService();
      if (service != null ) {      
         // Druckjob erstellen
         DocPrintJob druckJob = service.createPrintJob();
      
         // Druckdaten laden und drucken
         try {
            FileInputStream fis = new FileInputStream(dateiname);
            Doc doc = new SimpleDoc(fis, flavor, null);
          
            druckJob.print(doc, attrs); 
         } catch (FileNotFoundException e) { 
             System.console().printf("%s\n", e.getMessage());
         } catch (PrintException e) { 
             System.console().printf("%s\n", e.getMessage());
         }
      } else {
         JOptionPane.showMessageDialog(fenster, 
                                       "Kein Standarddrucker vorhanden", 
                                       "Druckfehler", 
                                       JOptionPane.ERROR_MESSAGE);
      }
*/

   }


   public static void main(String args[]) {

      Bildbetrachter fenster = new Bildbetrachter();
      fenster.setSize(500, 500);                   
      fenster.setLocation(200,300);   
      fenster.setVisible(true); 
   }
    
}







